% funkcja realizujaca poruszanie sie w wewnetrznym korytarzu

function ret = ruch_w_korytarzu(indeks_robota)

global mapa;
global roboty;
global serwer_ob;

lewa = 0;  
prawa = 9;
 %okreslamy wjazd do korytarza
 % wjazd zachodni lub wschodni
 korytarz = roboty(indeks_robota).indeks_korytarza; %zapamietujemy indeks aktualnego korytarza
 wjazd = roboty(indeks_robota).start(1) < serwer_ob.korytarze(korytarz,4).x;
    pozycja = roboty(indeks_robota).pozycja;  % aktualna pozycja

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
% przypadek 1: robot dopiero wprowadzony do korytarza
% - rezerwacja wszystkich pol potrzebnych, do realizacji zadan zwiazanych
% z pobraniem wszystkich przedmiotow z danego korytarza
% - okreslenie kierunku wyjazdu z korytarza
% - sprawdzenie czy nie musimy pobrac przedmiotow z tego pola (w razie
% koniecznosci wywolanie odpowiedniej funkcji)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

suma = 0;   % zakladamy ze maska robota jest pusta
for i = 1:8 % sprawdzamy czy tak jest...
 if roboty(indeks_robota).maska_korytarza(i).r > 0 
    suma = roboty(indeks_robota).maska_korytarza(i).r;
    break;
 end;
end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% rezewacja potrzebnych pol
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if suma == 0   % maska pusta, dopiero zaczynamy
% roboty(indeks_robota).start = roboty(indeks_robota).pozycja;
 roboty(indeks_robota).start = pozycja;
 wjazd = roboty(indeks_robota).start(1) < serwer_ob.korytarze(korytarz,4).x;

 drugi_wjazd=serwer_ob.korytarze(korytarz,8-(1-wjazd)*7);
rezerwuj(0,indeks_robota,[drugi_wjazd.x drugi_wjazd.y]);
 
    for i=1:size(roboty(indeks_robota).produkty,2) %tyle ile musimy zabrac produktow
        byl = 0;  %zakladamy ze nie bylo przednioty w korytarzu
        
     produkt = roboty(indeks_robota).produkty(i);  % numer aktualnie rozpatrywanego produktu
     x = round(produkt/1000); 
     y = mod(produkt,1000);
       
     
     if wjazd %wjazd z lewej
       for a = 1:8  %poruszamy si� w praw� stron� (jest 8 pol w korytarzu)
           % sprawdzamy czy dany przedmiot znajduje sie w korytarzu
           if (x == serwer_ob.korytarze(korytarz,a).x) && (y == serwer_ob.korytarze(korytarz,a).y-1 || y == serwer_ob.korytarze(korytarz,a).y+1) %jesli tak...
               % dopisujemy w odpowiednim polu maski, ze nalezy z tego pola zabrac produkt 
               roboty(indeks_robota).maska_korytarza(a).i = roboty(indeks_robota).maska_korytarza(a).i + 3;
                byl = 1; % flaga sygnalizujaca, ze byl produkt w danym korytarzu
                 % dopisujemy do tablicy indeksy tych produktow ktore sa w
            % korytarzu
            roboty(indeks_robota).produkty_in(size(roboty(indeks_robota).produkty_in,2)+1) = roboty(indeks_robota).produkty(i);
            if lewa < a
                lewa = a;
            end
           end
       end
                   for j=1:lewa  % rezerwacja odpowiednich pol
                      roboty(indeks_robota).maska_korytarza(j).r = indeks_robota; % rezerwacja w masce
                     % roboty(indeks_robota).maska_korytarza(:).r %%%%%%%%%%%
                      % rezerwacja na mapie
                      rezerwuj(1,indeks_robota,[serwer_ob.korytarze(korytarz,j).x,serwer_ob.korytarze(korytarz,j).y]);
                      %mapa' %%%%%%%%%
                   end
                 %   end_l = [serwer_ob.korytarze(korytarz,lewa).x serwer_ob.korytarze(korytarz,lewa).y] %tu skonczylismy zaczynajac z prawej
             
        
       
      %  mapa' %%%%%%%%%
      else % wjazd z prawej
         for a = 8:-1:1 % poruszamy sie w lewo
             %czynnosci te same jak dla wjazdu z lewej
           if (x == serwer_ob.korytarze(korytarz,a).x) && (y == serwer_ob.korytarze(korytarz,a).y-1 || y == serwer_ob.korytarze(korytarz,a).y+1)
               roboty(indeks_robota).maska_korytarza(a).i = roboty(indeks_robota).maska_korytarza(a).i + 3;
               byl = 1; % flaga sygnalizujaca, ze byl produkt w danym korytarzu
               % dopisujemy do tablicy indeksy tych produktow ktore sa w
            % korytarzu
            roboty(indeks_robota).produkty_in(size(roboty(indeks_robota).produkty_in,2)+1) = roboty(indeks_robota).produkty(i);
               if prawa > a   %najdalej oddalony produkt
                   prawa = a;
               end
           end
         end
                   for j = 8:-1:prawa  % rezerwacja odpowiednich pol
                      roboty(indeks_robota).maska_korytarza(j).r = indeks_robota; % rezerwacja w masce
                      %roboty(indeks_robota).maska_korytarza(:).i %%%%%%%%%%%
                      %rezerwacja na mapie
                      rezerwuj(1,indeks_robota,[serwer_ob.korytarze(korytarz,j).x,serwer_ob.korytarze(korytarz,j).y]);
                     % mapa' %%%%%%%%%%%
                   end
                 %   end_p = [serwer_ob.korytarze(korytarz,prawa).x serwer_ob.korytarze(korytarz,prawa).y] %tu skonczylismy zaczynajac z prawej
              
     end % wjazd
     
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      % okreslamy z ktorej strony lepiej nam opuscic korytarz
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      
      if byl == 0 || i == size(roboty(indeks_robota).produkty,2)
         if i == size(roboty(indeks_robota).produkty,2)
             docelowa_pozycja = serwer_ob.kasy(roboty(indeks_robota).numer_kasy,:);
             x=docelowa_pozycja(1);
             y=docelowa_pozycja(2);
         end
               x_l = serwer_ob.korytarze(korytarz,1).x;
               y_l = serwer_ob.korytarze(korytarz,1).y;
               x_p = serwer_ob.korytarze(korytarz,8).x;
               y_p = serwer_ob.korytarze(korytarz,8).y;
             odl_od_lewy=sqrt((x_l - x)^2 + (y_l - y)^2);
             odl_od_prawy=sqrt((x_p - x)^2 + (y_l - y)^2);
           
           if min(odl_od_lewy,odl_od_prawy)==odl_od_lewy  %blizej z prawej
              roboty(indeks_robota).wyjazd=[x_l y_l];
           elseif min(odl_od_lewy,odl_od_prawy)==odl_od_prawy  %blizej z lewej
              roboty(indeks_robota).wyjazd=[x_p y_p];
           end;  
   
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   % rezerwacja reszty korytarza w przypadku, gdy robot wyjazdza po
   % przeciwnej stronie niz wjechal
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
         do_rezerwacji=[];
         wyjazd=roboty(indeks_robota).wyjazd;
         % jesli pole wyjazdu jest zarezerwowane, wyjedz tym samym
         % korytarzem
         if(wyjazd(1) ~= roboty(indeks_robota).pozycja(1) && mapa(wyjazd(1),wyjazd(2))~=0)
             roboty(indeks_robota).wyjazd = roboty(indeks_robota).pozycja;
         end;
     if (wyjazd(1) ~= roboty(indeks_robota).pozycja(1)) && wjazd % -> rezerwacja w prawo
        for i = lewa+1:8
           do_rezerwacji = [do_rezerwacji; serwer_ob.korytarze(korytarz,i).x,serwer_ob.korytarze(korytarz,i).y];
        end
        if(rezerwuj(1,indeks_robota,do_rezerwacji)==1)
            for i = lewa+1:8
                roboty(indeks_robota).maska_korytarza(i).r = indeks_robota; 
            end;
        else
            roboty(indeks_robota).wyjazd = roboty(indeks_robota).start;
            
        end;
     elseif (wyjazd(1) ~= roboty(indeks_robota).pozycja(1)) && ~wjazd % -> rezerwacja w lewo
         for i = prawa-1:-1:1
           do_rezerwacji = [do_rezerwacji; serwer_ob.korytarze(korytarz,i).x,serwer_ob.korytarze(korytarz,i).y];
         end
        
        if(rezerwuj(1,indeks_robota,do_rezerwacji)==1)
            for i = prawa-1:-1:1
                roboty(indeks_robota).maska_korytarza(i).r = indeks_robota; 
            end;
        else
            roboty(indeks_robota).wyjazd = roboty(indeks_robota).start;
        end;
     end
              break;  % nie musimy dalej szukac, bo ten produkt jest juz poza korytarzem 
     end % byl
    end % for - tyle ile musimy zabrac produktow 
    
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % sprawdzamy czy nie musimy pobrac przedmiotu dostepnego z tego pola
    % (wywolanie funkcji pobierania lub wykonanie ruchu
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    if wjazd % jestesmy z lewej
        if (roboty(indeks_robota).maska_korytarza(1).i >= 1) % jest cos do zabrania
        roboty(indeks_robota).stan = 5; % pobieramy produkt
        else % wykonaj ruch w prawo, wiec zmiana x
           if mapa(roboty(indeks_robota).pozycja(1)+1,roboty(indeks_robota).pozycja(2)) == indeks_robota
               % zdjecie rezerwacji tylko w przypadku gdy robot opuszcza
               % korytarz po przeciwnej stronie
               if roboty(indeks_robota).wyjazd(1) ~= roboty(indeks_robota).pozycja(1)
                rezerwuj(0,indeks_robota,[roboty(indeks_robota).pozycja]); % zdjecie rezerwacji na mapie
                roboty(indeks_robota).maska_korytarza(1).r = 0;  % zdjecie rezerwacji w masce
               end
                roboty(indeks_robota).pozycja(1) = roboty(indeks_robota).pozycja(1) + 1; % wykonanie ruchu
                if sprawdz_produkt(indeks_robota)
                    roboty(indeks_robota).stan = 5;
                  %'sprawdzony'
                end
           end
        end
    else  % jestesmy z prawej
        if (roboty(indeks_robota).maska_korytarza(8).i >= 1) % jest cos do zabrania
       % ile = roboty(indeks_robota).maska_korytarza(8).i;
        %roboty(indeks_robota).czekaj = 3*ile;
        roboty(indeks_robota).stan = 5; % pobieramy produkt
        else % wykonaj ruch w lewo, wiec zmiana x
            if mapa(roboty(indeks_robota).pozycja(1)-1,roboty(indeks_robota).pozycja(2)) == indeks_robota
               % zdjecie rezerwacji tylko w przypadku gdy robot opuszcza
               % korytarz po przeciwnej stronie
               if roboty(indeks_robota).wyjazd(1) ~= roboty(indeks_robota).pozycja(1) 
                rezerwuj(0,indeks_robota,[roboty(indeks_robota).pozycja]); % zdjecie rezerwacji na mapie
                roboty(indeks_robota).maska_korytarza(8).r = 0; % zdjecie rezerwacji w masce
               end
                roboty(indeks_robota).pozycja(1) = roboty(indeks_robota).pozycja(1) - 1; % wykonanie ruchu
                 if sprawdz_produkt(indeks_robota)
                    roboty(indeks_robota).stan = 5;
                  %'sprawdzony'
                end
            end
        end
    end
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% przypadek - 2 robot znajdowal sie juz wczesniej w korytarzu
% - porowanie maski robota z zawartoscia mapy w celu aktualizacji pol,
% ktor nalezalo zarezerwowac na poczatku lecz byly zajete przez innego robota
    
   
else % czyli suma ~= 0 wiec robot juz wczesniej znajdowal sie w korytarzu
    startowe = roboty(indeks_robota).start;
    % porownujemy maske robota z mapa, w celu sprawdzenia czy nie zwolnily
    % sie jkies miejsca uprzednio zajete przez innego robota. Miejsca,
    % ktore sie zwolnily rezerwujemy na mapie
    do_rezerwacji=[];
    for i = 1:8
    if (roboty(indeks_robota).maska_korytarza(i).r ~= 0 )
        rezerwuj(1,indeks_robota,[ serwer_ob.korytarze(korytarz,i).x,serwer_ob.korytarze(korytarz,i).y]);
    end
    end
    
    start = startowe(1);
    punkt = pozycja(1) - start;
    if punkt < 0
        start = start  - 7;
        punkt = pozycja(1) - start + 1;
    else
        punkt = punkt + 1;
    end
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % wykonanie ruchu
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
    produkty = roboty(indeks_robota).produkty_in;
    if wjazd % zaczelismy z lewej
        numer = max(roboty(indeks_robota).produkty_in);
        if size(roboty(indeks_robota).produkty_in,2) == 0
            end_l = 0;
        else
        end_l = [round(numer/1000) mod(numer,1000)]; % miejsce najdalej na prawo
        end
        if roboty(indeks_robota).wyjazd(1) == startowe(1) % wyjazd z tej samej strony co wjazd
            if (end_l(1) == roboty(indeks_robota).wyjazd(1)) || (end_l(1) == 0 && pozycja(1) ~= roboty(indeks_robota).wyjazd(1))  %wszystko zabierane jest na starcie
               if  ruch(2,1,indeks_robota)  % ruch w lewo ze zwalnianiem
                %   roboty(indeks_robota).stan = 0; % KONIEC!!!!! wyjechaismy...
               end
            elseif size(roboty(indeks_robota).produkty_in,2) ~= 0  % dopoki sa produkty
                if ruch(1,0,indeks_robota);   % ruch w prawo bez zwalniania
                  if sprawdz_produkt(indeks_robota) 
                       roboty(indeks_robota).stan = 5;
                  end
                end
            else
                if pozycja(1) == roboty(indeks_robota).wyjazd(1)
                   if ruch(2,2,indeks_robota); % ruch w lewo ze zwalnianiem
                       roboty(indeks_robota).stan = 0; % KONIEC
                       
                     % wyzerowanie indeksu docelowego korytarza po zabraniu
                     % ostatniego produktu, aby robot nie rozpoczal kolejkowania do
                     % zadnego korytarza w drodze do kasy
                     if(size(roboty(indeks_robota).produkty,2)==0)
                         roboty(indeks_robota).indeks_korytarza=0;
                     end;
                   end
                end
            end
        else    % wyjazd po przeciwnej stronie
            if roboty(indeks_robota).wyjazd(1) == pozycja(1) % dojechalismy do konca
                if ruch(1,2,indeks_robota); % ruch w prawo ze zwalnianiem
                       roboty(indeks_robota).stan = 0; % KONIEC
                       
                     % wyzerowanie indeksu docelowego korytarza po zabraniu
                     % ostatniego produktu, aby robot nie rozpoczal kolejkowania do
                     % zadnego korytarza w drodze do kasy
                     if(size(roboty(indeks_robota).produkty,2)==0)
                         roboty(indeks_robota).indeks_korytarza=0;
                     end;
                end
            elseif suma ~= 0
                if ruch(1,1,indeks_robota); % ruch w prawo ze zwalnianiem
                  if sprawdz_produkt(indeks_robota)
                        roboty(indeks_robota).stan = 5;
                  end
                end
            end
        end
    else % zaczelismy z prawej
        numer = min(roboty(indeks_robota).produkty_in);
        if size(roboty(indeks_robota).produkty_in,2) == 0
            end_p = 0;
        else
        end_p = [round(numer/1000) mod(numer,1000)]; % miejsce najdalej na prawo
        end
        if roboty(indeks_robota).wyjazd(1) == startowe(1) % wyjazd z tej samej strony co wjazd
            if (end_p(1) == 0 && pozycja(1) ~= roboty(indeks_robota).wyjazd(1) )  %wszystko zabierane jest na starcie
                if  ruch(1,1,indeks_robota)  % ruch w prawo ze zwalnianiem
              %     roboty(indeks_robota).stan = 0; % KONIEC!!!!! wyjechaismy...
               end
            elseif size(roboty(indeks_robota).produkty_in,2) ~= 0  % dopoki sa produkty
                if ruch(2,0,indeks_robota);   % ruch w lewo bez zwalniania
                  if sprawdz_produkt(indeks_robota)
                  roboty(indeks_robota).stan = 5;
                  end
                end
            else
                if pozycja(1) == roboty(indeks_robota).wyjazd(1)
                   if ruch(1,2,indeks_robota); % ruch w prawo ze zwalnianiem
                       roboty(indeks_robota).stan = 0; % KONIEC
                       
                     % wyzerowanie indeksu docelowego korytarza po zabraniu
                     % ostatniego produktu, aby robot nie rozpoczal kolejkowania do
                     % zadnego korytarza w drodze do kasy
                     if(size(roboty(indeks_robota).produkty,2)==0)
                         roboty(indeks_robota).indeks_korytarza=0;
                     end;
                   end
                end
            end
        else    % wyjazd po przeciwnej stronie
            if roboty(indeks_robota).wyjazd(1) == pozycja(1) % dojechalismy do konca
                if ruch(2,2,indeks_robota); % ruch w lewo ze zwalnianiem
                       roboty(indeks_robota).stan = 0; % KONIEC
                       
                     % wyzerowanie indeksu docelowego korytarza po zabraniu
                     % ostatniego produktu, aby robot nie rozpoczal kolejkowania do
                     % zadnego korytarza w drodze do kasy
                     if(size(roboty(indeks_robota).produkty,2)==0)
                         roboty(indeks_robota).indeks_korytarza=0;
                     end;
                end
            elseif suma ~= 0
                if ruch(2,1,indeks_robota); % ruch w lewo ze zwalnianiem
                  if sprawdz_produkt(indeks_robota) 
                       roboty(indeks_robota).stan = 5;
                  end
                end
            end
        end
    end
    
    
end %if suma

ret = 0; 
